#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QDateTime>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
    cam(0),
    frame(0),
    hit(0)
{
    ui->setupUi(this);
    //初始化计时器
    timer = new QTimer(this);
    //绑定计时器的时间到了的事件，连接到刷新函数
    connect(timer, &QTimer::timeout, this, &Widget::update);
    //开启计时器
    timer->start(40);
    //设置使用的人脸检测模型
    std::string model = "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml";
    face = new MyFace(model);
    face->moveToThread(&facethread);
    db = new Databass();

    //qt不支持自定义的变量类型在线程间传递，要声明注册之后才可以使用 这是注册 声明在头文件
    qRegisterMetaType<cv::Mat>("cv::Mat");
    qRegisterMetaType<cv::Rect>("cv::Rect");
    qRegisterMetaType<Employee>("Employee");

    connect(this, &Widget::doDetect, face, &MyFace::detect);
    connect(face, &MyFace::detected, this, &Widget::updateFace);
    connect(this, &Widget::doRecognize, face, &MyFace::recognize);
    connect(face, &MyFace::recognized, this, &Widget::updateInfo);
    //connect(&facethread, &QThread::finished, face, &MyFace::deleteL);

    facethread.start();

}

int Widget::show_result(Employee &e, void *data)
{
    return 0;
}
void Widget::updateFace(cv::Rect face)
{
    range = face;
    if(face != cv::Rect(0, 0, 0, 0))
    {
        hit++;
    }else {
        hit = 0;
}
}
void Widget::updateInfo(Employee user)
{
    time_t now = QDateTime::currentDateTime().toTime_t();
    if(db->punch(user.id, now))
    {
        return;
    }
    std::string name = "";
    if(db->getname(user.id, name))
    {
        return;
    }
    ui->label_showname->setText(user.id.c_str());
    ui->label_id->setText(name.c_str());
    ui->label_time->setText(QDateTime::fromTime_t(now).toString("yyyy.MM.dd hh:mm:ss"));

}
void Widget::update()
{
    cv::Mat image;
    cam >> image;
    frame++;
    //每5帧检测一次人脸
    if((frame%5) == 0)
    {
        frame = 0;
        emit doDetect(image);
    }
    //5次连续检测到人人脸才会调用百度api进行人脸识别
    if(5 == hit)
    {
        hit = 0;
        //根据人脸块的信息从照片中获取到较小的人脸图
        cv::Mat faceimg(image, range);
        emit doRecognize(faceimg);
    }
    //在图像上显示人脸的框
    cv::rectangle(image,range, CV_RGB(255,0,0));
    //格式的转换 让图像可以在qt中显示
    cv::cvtColor(image, image, CV_BGR2RGB);
    QImage qimage(image.data, image.cols, image.rows,
                  image.step, QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(qimage));
}
//void Widget::update()
//{
//    cv::Mat image;
//    cam >> image;
//    frame++;
//    //每5帧检测一次人脸
//    if((frame%5) == 0)
//    {
//        frame = 0;
//        //获取人脸信息到range
//        if(face->detect(image))
//        {
//            hit++;
//        }else {
//            hit = 0;
//        }
//    }
//    //5次连续检测到人人脸才会调用百度api进行人脸识别
//    if(5 == hit)
//    {
//        hit = 0;
//        //根据人脸块的信息从照片中获取到较小的人脸图
//        cv::Mat faceimg(image,range);
//        //使用人脸识别接口，成功返回1
//        if(face->recognize(faceimg, user))
//        {
//            //在ui中显示打卡成功的信息
//            ui->label_result->setText("打卡成功");
//            ui->label_showname->setText(QString::fromStdString(user.id));
//            //时间暂时没用到，在数据库接口里有其他调用
//            time_t t;
//            db->punch(user.id, t);
//        }
//        //std::string name = db->getname(user.id);
//    }
//    //在图像上显示人脸的框
//    cv::rectangle(image,range, CV_RGB(255,0,0));
//    //格式的转换 让图像可以在qt中显示
//    cv::cvtColor(image, image, CV_BGR2RGB);
//    QImage qimage(image.data, image.cols, image.rows,
//                  image.step, QImage::Format_RGB888);
//    ui->label->setPixmap(QPixmap::fromImage(qimage));
//}

Widget::~Widget()
{
    delete ui;
    //delete face;
}


